﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SimulacionAgrofoods
{
    public class HeuristicaActual
    {
        List<Frio> frios;
        public int vencimiento = 4;

        public HeuristicaActual(List<Frio> frios) 
        {
            this.frios = frios;
        }

        public Frio Escoger_Frio(List<Lote> lotes)
        {
            int envio = 0;
            foreach (Lote l in lotes) 
            {
                envio += l.Cantidad;
            }
            if (frios[0].Capacidad_Sobrante() >= envio && frios[0].Capacidad_Enfriamiento >= frios[0].Llegada_Día) 
            {
                return frios[0];
            }
            
            List<Frio> friosordenados = frios.OrderBy(x => x.Llegada_Día).ToList();
            
            foreach (Frio f in friosordenados) 
            {
                if (f.Capacidad_Sobrante() >= envio && f.Capacidad_Enfriamiento >= f.Llegada_Día)
                {
                    return f;
                }
            }
            Random rand = new Random();
            return frios[rand.Next(1,6)];
        }

        public Frio Envio_Frio() 
        {

            List<Frio> friosordenados = frios.OrderBy(x => x.Duracion_Lote_Minimo()).ToList();

            return friosordenados[0];
        }

        public List<List<Lote>> Seleccionar_Camiones(List<Lote> lotes) 
        {
            List<List<Lote>> lotes_agrupados = new List<List<Lote>>();
            List<Lote> lotes_aux = new List<Lote>();

            if (lotes.Count == 0)
            {
                return lotes_agrupados;
            }
            else 
            {
                for (int i = 0; i < lotes.Count; i++) 
                {
                    lotes_aux.Add(lotes[i]);
                    if (i != lotes.Count - 1)
                    {
                        if (lotes_aux.Sum(x => x.Cantidad) + lotes[i + 1].Cantidad > 78)
                        {
                            lotes_agrupados.Add(lotes_aux);
                            lotes_aux = new List<Lote>();
                        }
                    }
                }
                if (lotes_aux.Count > 0) 
                {
                    lotes_agrupados.Add(lotes_aux);
                }
                return lotes_agrupados;
            }
        }
    }
}
